package com.ala4.oxcafe.async;

import com.ala4.oxcafe.core.entity.TaskEntity;

import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Path;
import java.util.Map;
import java.util.function.Supplier;

/**
 * 异步模版
 *
 * @author PING
 * @version 1.0
 * @date 2024/12/20 11:13
 */
public interface AsyncTemplate<T extends TaskEntity> {

    /**
     * 提交任务
     *
     * @param dto      任务DTO
     * @param supplier 回调函数 返回唯一信息
     * @return
     */
    default String submit(T dto, Supplier<String> supplier) {
        // 插入任务信息到数据库 插入成功就提交任务
        beforeSubmit(dto);
        // 调用提交到线程池 返回任务编码
        return supplier.get();
    }

    /**
     * 提交任务前执行
     *
     * @param dto
     */
    void beforeSubmit(T dto);

    /**
     * 完成后执行
     *
     * @param dto          任务DTO
     * @param tempFile     临时文件
     * @return
     * @throws IOException
     */
    Object doWhenFinish(T dto, Path tempFile) throws IOException;

    /**
     * 执行时发生异常执行
     *
     * @param dto 任务DTO
     * @param e   异常
     * @return
     */
    Object doWhenOccurException(T dto, Throwable e);

}
